import Vue from 'vue'
import Vuex from 'vuex'
import { userApi } from '@/api/index.js'
import config from '@/config/index.js'
import cart from './cart.js'
import coupon from './coupon.js'
Vue.use(Vuex)

const store = new Vuex.Store({
  modules: {
    cart,
    coupon
  },
  
  state: {
    // 用户信息
    userInfo: null,
    // 登录状态
    isLogin: false,
    // token
    token: ''
  },
  
  getters: {
    // 获取用户信息
    getUserInfo: state => state.userInfo,
    // 获取登录状态
    getIsLogin: state => state.isLogin,
    // 获取token
    getToken: state => state.token
  },
  
  mutations: {
    // 设置用户信息
    SET_USER_INFO(state, userInfo) {
      state.userInfo = userInfo
      state.isLogin = !!userInfo
    },
    
    // 设置token
    SET_TOKEN(state, token) {
      state.token = token
      // 持久化存储token
      if (token) {
        uni.setStorageSync('token', token)
      } else {
        uni.removeStorageSync('token')
      }
    },
    
    // 清除用户信息
    CLEAR_USER_INFO(state) {
      state.userInfo = null
      state.isLogin = false
      state.token = ''
      uni.removeStorageSync('token')
    }
  },
  
  actions: {
    // 微信登录
    async wechatLogin({ commit }, { code,encryptedData,iv }) {
      try {
        const res = await userApi.login({
          authCode: code,
          clientId: config.clientId,
          grantType: 'wx',
          tenantId: config.tenantId,
          encryptedData,
          iv
        })
        if (res.success || res.code === 200) {
          const token = res.data.access_token
          // 保存token
          commit('SET_TOKEN', token)
          await this.dispatch('fetchUserInfo')
          return { success: true}
        } else {
          throw new Error(res.message || '登录失败')
        }
      } catch (error) {
        console.error('微信登录失败:', error)
        throw error
      }
    },
    // 短信登录
    async smsLogin({ commit }, { phone, code }) {
      try {
        const res = await userApi.login({
          phonenumber: phone,
          smsCode: code,
          autoRegister: true,
          clientId: config.clientId,
          grantType: 'sms',
          tenantId: config.tenantId
        })
        if (res.success || res.code === 200) {
          const token = res.data.access_token
          // 保存token
          commit('SET_TOKEN', token)
          await this.dispatch('fetchUserInfo')
          return { success: true}
        } else {
          throw new Error(res.message || '登录失败')
        }
      } catch (error) {
        console.error('短信登录失败:', error)
        throw error
      }
    },
    
    // 获取用户信息
    async fetchUserInfo({ commit, state }) {
      try {
        // 如果没有token，不请求
        if (!state.token) {
          throw new Error('未登录')
        }
        
        const res = await userApi.getUserInfo()
        
        if (res.success || res.code === 200) {
          const userInfo = res.data
          commit('SET_USER_INFO', userInfo)
          return { success: true}
        } else {
          throw new Error(res.message || '获取用户信息失败')
        }
      } catch (error) {
        console.error('获取用户信息失败:', error)
        throw error
      }
    },
    
    // 初始化用户信息（从本地存储恢复）
    initUserInfo({ commit }) {
      const token = uni.getStorageSync('token')
      if (token) {
        commit('SET_TOKEN', token)
        // 这里可以进一步获取用户信息
        // this.dispatch('fetchUserInfo')
      }
    },
    
    // 退出登录
    logout({ commit }) {
      commit('CLEAR_USER_INFO')
    }
  }
})

export default store